package com.baidu.networkdemo

import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import com.baidu.networkdemo.api.Constants
import com.baidu.networkdemo.api.MovieApiInstance
import com.baidu.networkdemo.api.MovieApiInterface
import com.baidu.networkdemo.databinding.ActivityMainBinding
import com.baidu.networkdemo.databinding.MovieItemLayoutBinding
import com.baidu.networkdemo.model.Data
import com.bumptech.glide.Glide
import com.drake.brv.utils.linear
import com.drake.brv.utils.models
import com.drake.brv.utils.setup
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

/**
 * 从网络获取数据的完整流程
 * 1. 客户端（手机 网页）
 * 2. 服务器端 （服务器 + 数据库）
 *      服务器：一台/一群远程电脑[服务器集群]
 *             访问电脑的数据：IP[指定网络中的某一台电脑] + 端口号[指定对应的程序 80]
 *      数据库：服务器只能解决和用户进行交互，具体数据存储由服务器中的数据库来实现
 *      服务器端开发 Java开发 go语言开发
 * 3. 客户端如何向服务器端获取数据
 *    三次握手
 *    1. 客户端向服务器端发送请求 [把请求地址发给服务器端]
 *       http/https hiyperTextTransfer Protocol 超文本传输协议
 *          TCP/IP传输控制协议 有连接 安全 可靠  耗性能 视频
 *          UDP传输控制协议 飞鸽传书 无连接 不安全 不可靠
 *       https://www.baidu.com 对应的服务器的ip地址  Room
 *       https://www.baidu.com/search 对应服务器里面的哪个文件   Room的表
 *       https://www.baidu.com/search？wd=android开发 执行这个文件需要的参数   Room的表里面的字段
 *       https://www.baidu.com/search？wd=android开发&type=1 由多个参数   Room的表里面的多个字段
 *    2. 服务器端接收到请求后，根据请求地址，返回对应的数据
 *       response [响应] 服务器端返回给客户端的数据
 *    3. 建立连接关系 开始传输
 */

/**
 * 使用原始方式获取网络数据
 * 1. 获取请求地址 https://moviesapi.ir/api/v1/movies?page=1
 * 2. 创建地址对应URL类型
 * 3. 通过URL获取对应的连接对象 URLConnection -> HTTPURLConnection
 *      responseCode 获取响应码
 *      headerFields 响应头部信息
 *          Content-Type
 *              字符串 Application/json   BufferReader
 *              文件  Image/JPEG PNG     BufferedInputStream
 *                   Video/mp4 mov
 *          Content-Length
 * 4. 申明网络访问权限
 *
 * <students>
 *     <student>
 *         <name>jack</name>
 *         <age>12</age>
 *     </student>
 *
 *     <student>
 *          <name>jack</name>
 *          <age>12</age>
 *    </student>
 * </students>
 *
 * JSON格式在线格式化工具
 *  可以和数据类型关联
 *  {} 表示一个对象
 *  [] 表示一个数组
 *
 * 服务器返回的字符串必须按照一定的格式返回
 *      Application/json 返回的字符串是JSON格式的字符串
 *      Application/xml 返回的字符串是XML格式的字符串
 *
 *
 * 借助一个插件自动创建数据对应的模型数据
 * JSon TO Kotlin
 *
 * Gson: 三方库
 *       将json格式的字符串 -> 对象
 *       Gson().fromJson(content, Movies::class.java)
 *       对象  -> json格式的字符串
 *       val jsonString = Gson().toJson(movies)
 */
class MainActivity : AppCompatActivity() {
    private lateinit var mBinding: ActivityMainBinding
    private val viewModel: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        /*
        //a  主线程中
        lifecycleScope.launch(Dispatchers.IO) {
            val url = URL("https://moviesapi.ir/api/v1/movies?page=1")
            //val url = URL("https://gips3.baidu.com/it/u=3732737575,1337431568&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f1440_2560")
            val connection = url.openConnection() as HttpURLConnection
            if (connection.responseCode == HttpURLConnection.HTTP_OK) {
                //获取详细的请求头部信息
                connection.headerFields.entries.forEach { entry ->
                    //Log.v("pxd", "Key: ${entry.key}")
                    //Log.v("pxd", "Values: ${entry.value}\n")
                    //Log.v("pxd","-")
                }
                //有内容才开始下载数据 建立连接
                BufferedReader(InputStreamReader(connection.inputStream)).use { br ->
                    //一次性读取所有内容
                    val content= br.readText()
                    //将Json格式的字符串转化为对象
                    val movies = Gson().fromJson(content, Movies::class.java)

                }
            }
        }

        lifecycleScope.launch(Dispatchers.IO) {
            val url = URL("https://gips3.baidu.com/it/u=3732737575,1337431568&fm=3028&app=3028&f=JPEG&fmt=auto&q=100&size=f1440_2560")
            val connection = url.openConnection() as HttpURLConnection
            if (connection.responseCode == HttpURLConnection.HTTP_OK) {
               BufferedInputStream(connection.inputStream).use { bis ->
                   //获得bitmap
                   val bitmap = BitmapFactory.decodeStream(bis)

                   //保存到文件
                   val os = FileOutputStream("....")
                   bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os)

                   //
                   val fos = FileOutputStream("....")
                   val buffer = ByteArray(1024)
                   var len = 0
                   while (len != -1) {
                       len = connection.inputStream.read(buffer,0,1024)
                       fos.write(buffer,0,len)
                       fos.flush()
                   }

               }
            }
        }
         */
        initRecyclerView()
        /*
        1. Entity -> Model
        2. Dao -> Interface
        3. RoomDatabase -> Abstract class
        4. Repository
        5. ViewModel
        6. Activity/Fragment
         */
        mBinding.floatingActionButton.setOnClickListener {
            Toast.makeText(this,"click",Toast.LENGTH_SHORT).show()
            viewModel.onLoadMovies()
        }

        viewModel.dataList.observe(this){
            mBinding.recyclerView.models = it
        }
    }

    private fun initRecyclerView() {
        mBinding.recyclerView.linear().setup {
            addType<Data>(R.layout.movie_item_layout)
            onBind {
                val binding = getBinding<MovieItemLayoutBinding>()
                val model = getModel<Data>()

                //绑定图片
                Glide.with(context)
                    .load(model.poster)
                    .placeholder(R.drawable.ic_launcher_background)
                    .into(binding.ivIcon)
                //电影名称
                binding.tvTitle.text = model.title
                //国家和时间
                binding.tvCountry.text = "${model.year} ${model.country}"
            }
        }
    }
}





















